package com.ftp.utils;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

import java.io.*;

/**
 * 实现FTP的上传、下载、删除
 */
public class FtpUtils {


    /**
     * 上传文件
     *
     * @param pathname       ftp服务器保存的目录
     * @param fileName       上传到ftp的文件名
     * @param originFileName 待上传文件的路径(绝对路径)
     * @return
     */
    public static boolean uploadFile(String pathname, String fileName, String originFileName) {
        try {
            return uploadFile(pathname, fileName, new FileInputStream(new File(originFileName)));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 上传文件
     *
     * @param pathname    ftp服务器保存的目录
     * @param fileName    上传到ftp的文件名
     * @param inputStream 输入文件流
     * @return
     */
    public static boolean uploadFile(String pathname, String fileName, InputStream inputStream) {
        System.out.println("开始上传文件");
        boolean flag = false;
        //连接ftp服务器
        FTPClient ftpClient = FtpConnectUtils.connectFtpServer();
        try {
            if (ftpClient != null) {
                //在ftp服务器上创建目录（允许创建多级目录）
                new FtpDirectoryOperate(ftpClient).createDirectory(pathname);
                //进入目录
                ftpClient.changeWorkingDirectory(pathname);
                //保存文件
                ftpClient.storeFile(fileName, inputStream);
                //登出账号
                ftpClient.logout();
                flag = true;
                System.out.println("上传文件成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("上传文件失败");
        } finally {
            if (ftpClient != null) {
                //关闭ftp服务器
                FtpConnectUtils.closeFtpServer(ftpClient);
            }
            //关闭流
            IOUtils.silenceClose(inputStream);
        }
        return flag;
    }

    /**
     * 下载文件
     *
     * @param pathname  FTP服务器文件的目录
     * @param filename  FTP服务器的文件名称
     * @param localPath 本地存放的路径
     * @return
     */
    public static boolean downloadFile(String pathname, String filename, String localPath) {
        System.out.println("开始下载文件");
        //下载的标记位。 true：下载成功。 false：下载失败
        boolean flag = false;
        OutputStream os = null;
        //连接ftp服务器
        FTPClient ftpClient = FtpConnectUtils.connectFtpServer();
        try {

            //进入目录
            if (ftpClient != null) {
                ftpClient.changeWorkingDirectory(pathname);
                //获取目录下的所有文件
                FTPFile[] ftpFiles = ftpClient.listFiles();
                for (FTPFile file : ftpFiles) {
                    if (filename.equalsIgnoreCase(file.getName())) {//存在要下载的文件
                        //文件所在位置
                        File localFile = new File(localPath + "/" + file.getName());
                        //保存文件的目录
                        File parentFile = localFile.getParentFile();
                        if (!parentFile.exists()) {//目录不存在
                            //创建目录
                            parentFile.mkdirs();
                        }
                        //创建文件字节输出流
                        os = new FileOutputStream(localFile);
                        //将内容输出到文件中
                        ftpClient.retrieveFile(file.getName(), os);
                    }
                }
                //登出账号
                ftpClient.logout();
                flag = true;
                System.out.println("下载文件成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("下载文件失败");
        } finally {
            if (ftpClient != null) {
                //关闭ftp服务器
                FtpConnectUtils.closeFtpServer(ftpClient);
            }
            //关闭流
            IOUtils.silenceClose(os);
        }
        return flag;
    }

    /**
     * 删除文件
     *
     * @param pathname FTP服务器文件的目录
     * @param filename FTP服务器的文件名称
     * @return
     */
    public static boolean deleteFile(String pathname, String filename) {
        System.out.println("开始删除文件");
        // 标记位，true表示下载成功，false表示下载失败
        boolean flag = false;
        //连接ftp服务器
        FTPClient ftpClient = FtpConnectUtils.connectFtpServer();
        try {
            if (ftpClient != null) {
                //进入目录
                ftpClient.changeWorkingDirectory(pathname);
                //删除文件
                ftpClient.dele(filename);
                //登出账号
                ftpClient.logout();
                flag = true;
                System.out.println("删除文件成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("删除文件失败");
        } finally {
            if (ftpClient != null) {
                //关闭ftp服务器
                FtpConnectUtils.closeFtpServer(ftpClient);
            }
        }

        return flag;
    }
}
